﻿# -*- coding: utf-8 -*-
import pymysql

# 社区的存储
comm_list = []

# 打开数据库连接
connection = pymysql.connect(host = '',
                            user = '',
                            password = '',
                            db = '',
                            charset = 'utf8')

# 使用 cursor() 方法创建一个游标对象 cursor
cursor = connection.cursor()
# 使用 execute()  方法执行 SQL 查询 
cursor.execute("SELECT a_name from author_info group by a_name")
author_list = cursor.fetchall()

# 判断这个用户是否已经被分区，已经被分区之后就不需要再次分区了。
def isAuthorInComm(author):
    for comm in comm_list:
        if(author in comm):
            return True
    return False

for author in author_list:
    author = author[0]
    comm_dirt = {}
    # 判断当前作者是否已经被分区，如果已经分区，不操作，循环下一次，否则，继续进行
    if(isAuthorInComm(author)):
        continue
    else:
        comm_dirt[author] = 0

    print(author)

    # 根据当前的作者进行关系的筛选
    cursor.execute("SELECT name_2 from author_conn where name_1='%s'"%author)
    name_list = cursor.fetchall()

    # 开始循环获取关系网
    # 当需要存入的用户数量为0的时候，说明这个关系网的人已经都有了。
    while(len(name_list)>0):
        # 使用临时变量存每次循环需要录入的新用户
        temp = name_list
        # 然后置空，留下给下次存放的空间
        name_list = []

        # 将每个新用户存入关系网。如果已经存过了，就+1，如果没存过，就存上。
        # 如果这个用户存过了，那说明就不需要从数据库中获取他的下一次关系了，直接continue就好了。
        for name in temp:
            name = name[0]
            if(name in comm_dirt):
                comm_dirt[name] = comm_dirt[name]+1
                continue
            else:
                comm_dirt[name] = 1

            # 获取当前新用户的关系网，这里不做存入，只是将他的合作伙伴们加到下一次需要循环的人里面。
            cursor.execute("SELECT name_2 from author_conn where name_1='%s'"%name)
            res_name_list = cursor.fetchall()
            for i in range(len(res_name_list)):
                name_list.append(res_name_list[i])
            
            # 然后就开始准备下一波的判断了

    # 一张关系网获取结束。存入，然后开始下一次的获取。
    comm_list.append(comm_dirt)

connection.close()

# 将得到的网络社区存到文件里面。
fp = open('temp.txt','w')
print(comm_list,file=fp)
fp.close()